package wangwenjun.phase2.concurrencypattern.eventrouter.demo02.framework;

import java.util.HashMap;
import java.util.Map;

/**
 * @author ChangLiang
 * @date 2020/6/20
 */
public class Router implements IRouter<Message> {

    /**
     * Router 不是一个线程安全的类
     * Router 是对IRouter 的一个最基本的实现，适合在单线程的情况下进行使用，因此不需要考虑线程安全的问题
     */

    /**
     * 用于保存Channel 和Message 之间的关系
     */
    private final Map<Class<? extends Message>, Channel> routerTable;

    public Router() {
        routerTable = new HashMap<>();
    }

    @Override
    public void registerChannel(Class<? extends Message> messageType, Channel<? extends Message> channel) {
        this.routerTable.put(messageType, channel);
    }

    @Override
    public void dispatch(Message message) {
        if (routerTable.containsKey(message.getType())) {
            routerTable.get(message.getType()).dispatch(message);
        } else {
            throw new NoMatchedChannelException("cannot find the matched channel for message type:[" + message.getType() +"}]");
        }
    }
}
